package pe.com.bn.sach.calculoCuota;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.ResourceBundle;

import org.apache.log4j.Logger;

public class CalculoCuotaHipotecario {

	private static Logger log = Logger.getLogger(Util.class.getName());	
	
	public Hashtable CalculoPrestamoCuota(
			double montoPrestamo
			,double comisionEvaluacion 
			,double tasaAnual
			,int yearPago, int monthPago, int dayPago 
			,double tasaSegDesgravMensual
			,double valorInmueble
			,double tasaSegInmuebleMensual
			,int plazoPago
			,double portes
			,int diaPagoSel
			,int mesesGracia
			,int dobleJulio
			,int dobleDiciembre
			,int finanGraciaAgente			
			){
		
		ArrayList calculoCuota = null;

		calculoCuota = CalculoBaseCuota(
				montoPrestamo
				,comisionEvaluacion 
				,tasaAnual
				,yearPago, monthPago, dayPago 
				,tasaSegDesgravMensual
				,valorInmueble
				,tasaSegInmuebleMensual
				,plazoPago
				,portes
				,diaPagoSel
				,mesesGracia
				,dobleJulio
				,dobleDiciembre
				,finanGraciaAgente);
		
		
		//Ingresando la data para el Costo Efectivo Anual
		
		double costoEfectivo = 0.0;
		CostoEfectivoAnual costoEfectivoAnual = new CostoEfectivoAnual(); 
		costoEfectivo = costoEfectivoAnual.CalculoCostoEfectivo(
				tasaAnual
				,yearPago,monthPago,dayPago 
				,plazoPago
				,diaPagoSel
				,mesesGracia
				,dobleJulio
				,dobleDiciembre
				, calculoCuota);
		
		
		Hashtable dataCalculoCuota = new Hashtable();
		dataCalculoCuota.put("calculoCuota",calculoCuota);
		dataCalculoCuota.put("costoEfectivo",new Double(costoEfectivo));
		return dataCalculoCuota;
	
	}
	
	
	public ArrayList CalculoBaseCuota(
			double montoPrestamo
			,double comisionEvaluacion 
			,double tasaAnual
			,int yearPago, int monthPago, int dayPago 
			,double tasaSegDesgravMensual
			,double valorInmueble
			,double tasaSegInmuebleMensual
			,int plazoPago
			,double portes
			,int diaPagoSel
			,int mesesGracia
			,int dobleJulio
			,int dobleDiciembre
			,int finanGraciaAgente) {
	
	    ResourceBundle rb = ResourceBundle.getBundle("parametro");
	    String ValInmubFijo = rb.getString("calcInmubFijo");

		
		//PASO 01: Obteniendo el saldo inicial
		double saldoInicial = 0.0;
		
		saldoInicial = Util.redondeoDouble(montoPrestamo + comisionEvaluacion,Util.NUM_DIGITOS_DECIMAL_2) ;

		//PASO 02: Obtencion los factores
	
		//Obteniendo el periodo de gracia
		Hashtable dataGracia = null;
		ArrayList cuotasGracia = null;
		//double valorActInmGracia = 0.0;
		
		if (mesesGracia != 0){
			dataGracia = Util.CalculoPeridoGracia(
					mesesGracia
					,saldoInicial
					,yearPago,monthPago, dayPago, diaPagoSel
					,tasaAnual
					,tasaSegDesgravMensual
					,valorInmueble
					,tasaSegInmuebleMensual
					,finanGraciaAgente
					,ValInmubFijo);

			double[] amortGracia = null;
			amortGracia = (double[])dataGracia.get("amortgracia");
			cuotasGracia = (ArrayList)dataGracia.get("lista");
			
			//valorActInmGracia = amortGracia[2];
			//Util.printCronograma(cuotasGracia);
			
		}else{
				
		}
		
		
		Hashtable data = null;
		
		data = Util.cronoAmortizSemilla(
				saldoInicial
				,tasaAnual 
				,yearPago, monthPago, dayPago
				,tasaSegDesgravMensual
				,valorInmueble
				,tasaSegInmuebleMensual
				,plazoPago
				,portes
				,diaPagoSel
				,mesesGracia				
				,dobleJulio
				,dobleDiciembre
				,ValInmubFijo
				,cuotasGracia) ;
		
		double[] amortizacion = null;
		ArrayList cuotas = null;
		amortizacion = (double[])data.get("amortiz");
		cuotas = (ArrayList)data.get("lista");
		
		double sumaFactor = amortizacion[0];
		double saldoCalc = amortizacion[1];
		double valorPrsntInm = amortizacion[3];
		double valorPrsntPorte = amortizacion[4];
		
		
		double valorTotalPrest = Util.redondeoDouble((
					saldoCalc
					+ valorPrsntInm 
					+ valorPrsntPorte),
					Util.NUM_DIGITOS_DECIMAL_2);

		//calculando la cuota
		 double cuota = Util.redondeoDouble((valorTotalPrest/sumaFactor),
		 					Util.NUM_DIGITOS_DECIMAL_2);
		 
	      //log.info("saldo Icicial:"+saldoInicial);
		  //log.info("Valor Act Inmueble:"+valorPrsntInm);
		  //log.info("Valor Ac Portes:"+valorPrsntPorte);
		  //log.info("Valor Ac Inmueble Gracia:"+valorActInmGracia);
		  //log.info("saldoCalc:"+saldoCalc);
		  //log.info("Valor Total Presente:"+valorTotalPrest);
		  //log.info("Cuota:"+cuota);
  		  //Util.printCronograma(cuotas);
		 
		 //Hallando los valores de las amortizaciones
		 Util.cronogramaAmortizacion(
		 		cuota
				,tasaAnual
				,tasaSegDesgravMensual
				,plazoPago
				,mesesGracia
				,cuotas);
         
		 
		 ArrayList cuotasFin = null;
		 cuotasFin = (ArrayList)data.get("lista");

		 return cuotasFin;
		
	}

	
}
